package com.LeetCodeT.Greedy;
// -*- coding: utf-8 -*-

import org.junit.jupiter.api.Test;

import java.util.ArrayList;

/**
 * Project: AlgorithmsLearn
 *
 * @author: yanking
 * Create time: 2022-03-03 19:46
 * IDE: IntelliJ IDEA
 * Introduction:
 */
@SuppressWarnings("AlibabaUndefineMagicConstant")
public class WiggleMaxLength {
    /**
     * 摆动序列
     */
    public int wiggleMaxLength(int[] nums) {
        /*
         * 特殊情况: 1 只有一个符号摆动->所以至少为一 2 前面元素相同
         * 数组中的元素不相等
         */

        // 使用栈 -> 可以保证数组中元素的顺序
        int n = nums.length;
        if (n == 1) {
            return 1;
        }
        // 用于存储数组两两之间的差值
        ArrayList<Integer> stack = new ArrayList<>();
        int k = 0, i = 1;
        while (nums[k] == nums[i]) {
            ++k;
            ++i;
            if (i >= n) {
                return 1;
            }
        }


        int pre, num = nums[i];
        stack.add(nums[i] - nums[k]);
        char sign;
        if (nums[i] - nums[k] > 0) {
            sign = '+';
        } else {
            sign = '-';
        }
        while (i < n) {
            pre = num;
            num = nums[i++];
            if (checkSign(pre, num, sign)) {
                // 当前数组符合摆动序列的构成
                stack.add(num - pre);
                sign = change(sign);

            }
        }
        return stack.size() + 1;
    }


    /**
     * 改变符号
     *
     * @param sign
     * @return
     */
    private char change(char sign) {
        if (sign == '+') {
            return '-';
        }
        return '+';
    }


    /**
     * @param top  : 栈顶元素
     * @param num  : 新来元素
     * @param sign : 上一次差值的符号
     * @return : 根据符号判断新来元素是否符号规则
     */
    private boolean checkSign(Integer top, int num, char sign) {
        return (sign == '+') && (top > num) || (sign == '-') && (top < num);
    }

    @Test
    public void shout() {
        int[] nums = {1, 17, 5, 10, 13, 15, 10, 5, 16, 8};
        System.out.println(wiggleMaxLength(nums));
    }

}
